<?php
/**
 * 优化后的客户模型
 * 由于业务字段已冗余到oa_customer表，查询逻辑大幅简化
 */

namespace app\model\customer;

use app\model\BaseModel;
use think\facade\Db;

/**
 * 客户模型 - 优化版
 * 对应数据库表: oa_customer (客户表)
 */
class Customer extends BaseModel
{
    // 设置表名（不包含前缀）
    protected $name = 'customer';

    // 设置主键
    protected $pk = 'id';

    // 设置字段类型
    protected $type = [
        'customer_type' => 'integer',
        'source_id' => 'integer',
        'grade_id' => 'integer',
        'industry_id' => 'integer',
        'services_id' => 'integer',
        'provinceid' => 'integer',
        'cityid' => 'integer',
        'distid' => 'integer',
        'townid' => 'integer',
        'customer_status' => 'integer',
        'intent_status' => 'integer',
        'contact_first' => 'integer',
        'admin_id' => 'integer',
        'belong_uid' => 'integer',
        'belong_did' => 'integer',
        'belong_time' => 'datetime',
        'distribute_time' => 'datetime',
        'follow_time' => 'datetime',
        'next_time' => 'datetime',
        'discard_time' => 'datetime',
        'is_lock' => 'integer',
        'create_time' => 'int',
        'update_time' => 'int',
        'is_primary' => 'integer',
        'group_code' => 'string',
        'controller_name' => 'string',
        'relation_desc' => 'string',
        // 新增业务字段
        'is_member' => 'integer',
        'membership_end_time' => 'int',
        'membership_days_remaining' => 'int',
        'contract_num' => 'integer',
        'contract_amount' => 'decimal:2',
        'latest_contract_sign_time' => 'int',
        'case_num' => 'integer',
        'case_processing' => 'integer',
        'case_finished' => 'integer',
        'latest_case_status' => 'integer',
        'latest_case_update_time' => 'int'
    ];

    /**
     * 获取客户列表（优化版 - 直接查询冗余字段）
     * @param array $where 查询条件
     * @param int $page 页码
     * @param int $limit 每页数量
     * @return array 客户列表数据
     */
    public function getCustomerList($where = [], $page = 1, $limit = 10)
    {
        // 简化后的查询 - 直接查询客户表所有字段（包括冗余的业务字段）
        $query = $this->alias('c')
            ->where($where)
            ->join('oa_customer_grade g', 'c.grade_id = g.id', 'LEFT')
            ->join('oa_customer_source s', 'c.source_id = s.id', 'LEFT')
            ->join('oa_admin a', 'c.belong_uid = a.id', 'LEFT')
            ->join('oa_admin a2', 'c.admin_id = a2.id', 'LEFT')
            ->join('oa_customer_contact cc', 'c.id = cc.cid AND cc.is_default = 1 AND cc.delete_time = 0', 'LEFT')
            ->field('c.*, g.title as grade_name, s.title as source_name, a.name as belong_name,
                   a2.name as creator_name,
                   cc.name as contact_name, cc.mobile as contact_mobile');

        // 查询总数
        $totalQuery = clone $query;
        $total = $totalQuery->count();

        // 分页查询
        $list = $query->page($page, $limit)->select()->toArray();

        // 记录SQL日志（简化后）
        if (config('app.app_debug')) {
            trace('Customer list query (optimized): ' . $query->fetchSql()->select());
        }

        // 从oa_basic_customer表获取状态配置
        $statusConfig = Db::name('basic_customer')
            ->where('types', '1')
            ->column('title', 'id');

        // 处理列表数据（直接使用冗余字段，无需额外查询）
        $processedList = array_map(function($item) use ($statusConfig) {
            // 基础信息
            $item['customer_status_name'] = $statusConfig[$item['customer_status'] ?? 0] ?? '未知';

            // 处理跟进时间显示
            if (!isset($item['last_follow_time']) || $item['last_follow_time'] === null || $item['last_follow_time'] <= 0) {
                $item['last_follow_time'] = null;
                $item['last_follow_time_text'] = '无跟进';
            } else {
                $timestamp = $item['last_follow_time'] > 9999999999 ? $item['last_follow_time'] / 1000 : $item['last_follow_time'];
                $item['last_follow_time_text'] = date('Y-m-d H:i:s', $timestamp);
            }

            // 确保联系人信息不为空
            if (!isset($item['contact_name'])) {
                $item['contact_name'] = '';
            }
            if (!isset($item['contact_mobile'])) {
                $item['contact_mobile'] = '';
            }

            // 业务字段（直接来自冗余字段，无需额外处理）
            // is_member, membership_days_remaining, contract_num, contract_amount
            // case_num, case_processing, case_finished 等字段已经是正确的格式

            return $item;
        }, $list);

        return [
            'list' => $processedList,
            'total' => $total,
            'page' => $page,
            'limit' => $limit
        ];
    }

    /**
     * 获取客户详情（优化版）
     * @param int $id 客户ID
     * @return array|null
     */
    public function getCustomerDetail($id)
    {
        return $this->where('id', $id)
            ->where('delete_time', 0)
            ->find();
    }

    /**
     * 添加客户
     * @param array $data 客户数据
     * @return int
     */
    public function addCustomer($data)
    {
        return $this->insertGetId($data);
    }

    /**
     * 更新客户
     * @param int $id 客户ID
     * @param array $data 更新数据
     * @return bool
     */
    public function updateCustomer($id, $data)
    {
        $result = $this->where('id', $id)->update($data);
        return $result !== false;
    }

    /**
     * 软删除客户
     * @param int $id 客户ID
     * @return bool
     */
    public function softDeleteCustomer($id)
    {
        $result = $this->where('id', $id)->update(['delete_time' => time()]);
        return $result !== false;
    }

    /**
     * 废弃/恢复客户
     * @param int $id 客户ID
     * @param string $reason 废弃原因
     * @return bool
     */
    public function discardCustomer($id, $reason)
    {
        $data = [
            'discard_time' => time(),
            'discard_reason' => $reason
        ];
        $result = $this->where('id', $id)->update($data);
        return $result !== false;
    }

    /**
     * 恢复客户
     * @param int $id 客户ID
     * @return bool
     */
    public function restoreCustomer($id)
    {
        $result = $this->where('id', $id)->update(['discard_time' => 0, 'discard_reason' => '']);
        return $result !== false;
    }

    /**
     * 获取客户ID列表（带分页）
     * @param array $where 查询条件
     * @param int $page 页码
     * @param int $limit 每页数量
     * @return array
     */
    public function getCustomerIds($where = [], $page = 1, $limit = 10)
    {
        $query = $this->where($where)->field('id');
        $total = $query->count();
        $list = $query->page($page, $limit)->column('id');

        return [
            'list' => $list,
            'total' => $total,
            'page' => $page,
            'limit' => $limit
        ];
    }
}
